"""
微信抢红包：100元 -- 5个人
又要随机又要保证金额差距不是特别大
"""
import random

"""
方法1：二倍均值法

假设剩余红包金额为m元，剩余人数为n，那么有如下公式：
        每次抢到的金额= 随机区间 [0.01, m/n × 2 - 0.01]元
        
这个公式，保证了每次随机金额的平均值是相等的，不会因为抢红包的先后顺序而造成不公平。

下面举个例子。
    假设有5个人，红包总额为100元。
    
    100 ÷ 5 × 2 = 40，所以第1个人抢到的金额的随机范围是[0.01，39.99]元，在正常情况下，平均可以抢到20元。
    假设第1个人随机抢到了20元，那么剩余金额是80元。
    
    80 ÷ 4 × 2 = 40，所以第2个人抢到的金额的随机范围同样是[0.01，39.99]元，在正常的情况下，还是平均可以抢到20元。
    假设第2个人随机抢到了20元，那么剩余金额是60元。
    
    60 ÷ 3 × 2 = 40，所以第3个人抢到的金额的随机范围同样是[0.01，39.99]元，平均可以抢到20元。
    以此类推，每一次抢到金额的随机范围的均值都是相等的。
"""


def divide_red_package(total_amount, total_people_num):
    """
    :param total_amount: 发的红包金额
    :param total_people_num: 发红包的份数
    :return:
    """
    amount_list = []
    rest_amount = total_amount * 100
    rest_people_amount = total_people_num
    for i in range(0, total_people_num - 1):
        # 随机范围：[1, 剩余人均金额的两倍) 左闭右开
        amount = random.randint(1, int(rest_amount / rest_people_amount * 2) - 1)
        rest_amount -= amount
        rest_people_amount -= 1
        amount_list.append(amount / 100)
    amount_list.append(rest_amount / 100)
    return amount_list


def generate_red_packet(total_amount, total_num):
    results = []
    rest_amount = total_amount
    rest_num = total_num
    for i in range(total_num - 1):
        amount = round(random.uniform(0.01, rest_amount / rest_num * 2), 2)
        rest_amount -= amount
        rest_num -= 1
        results.append(amount)
    results.append(round(rest_amount, 2))
    return results


def test():
    my_amount_list = divide_red_package(100, 10)
    print(my_amount_list, sum(my_amount_list))
    for my_amount in my_amount_list:
        print("抢到金额：%.2f" % my_amount)


if __name__ == '__main__':
    test()
